package bridge

import "fmt"

// Implementor 定义实现部分接口，可以与抽象部分接口的方法不一样
type Implementor interface {
	// operationImpl 示例方法，实现抽象部分需要的某些具体功能
	operationImpl()
}

// Abstraction 定义抽象部分接口
type Abstraction interface {
	// 示例操作，实现一定的功能，可能需要转调实现部分的具体功能
	operation()
}

// ConcreteImplementorA 真正的具体实现对象
type ConcreteImplementorA struct {
}

// operationImpl 真正的实现
func (c *ConcreteImplementorA) operationImpl() {
	fmt.Println(" ConcreteImplementorA ")
}

// ConcreteImplementorB 真正的具体实现对象
type ConcreteImplementorB struct {
}

// operationImpl 真正的实现
func (c *ConcreteImplementorB) operationImpl() {
	fmt.Println(" ConcreteImplementorB ")
}

// RefinedAbstractionA 扩充Abstraction定义的接口功能
type RefinedAbstractionA struct {
	impl Implementor
}

func NewRefinedAbstractionA(impl Implementor) *RefinedAbstractionA {
	return &RefinedAbstractionA{
		impl: impl,
	}
}

// operation 示例操作，实现一定的功能
func (r *RefinedAbstractionA) operation() {
	// 实现一定的功能，可能会使用具体实现部分的实现方法
	// 但是本方法更大的可能是使用Abstraction定义的方法
	// 通过组合使用Abstraction中定义的方法来完成更多的功能
	fmt.Print("RefinedAbstractionA->")
	r.impl.operationImpl()
}

// RefinedAbstractionB 扩充Abstraction定义的接口功能
type RefinedAbstractionB struct {
	impl Implementor
}

func NewRefinedAbstractionB(impl Implementor) *RefinedAbstractionB {
	return &RefinedAbstractionB{
		impl: impl,
	}
}

// operation 示例操作，实现一定的功能
func (r *RefinedAbstractionB) operation() {
	// 实现一定的功能，可能会使用具体实现部分的实现方法
	// 但是本方法更大的可能是使用Abstraction定义的方法
	// 通过组合使用Abstraction中定义的方法来完成更多的功能
	fmt.Print("RefinedAbstractionB->")
	r.impl.operationImpl()
}
